本文同步發表於小弟自架網站:微確幸資訊站
資料範例是索引共有四層(0-3層),分別為['學年', '學期', '學制', '性別']
學年:108, 109
學期:1, 2
學制:"博士班", "碩士班", "大學部"
性別:"女", "男"
先看一下資料在Excel中的顯示:
import pandas as pd
import numpy as np
year = [108, 109]
semester = [1, 2]
academic = ['博士班', '碩士班', '大學部']
gender = ['女', '男']
index = pd.MultiIndex.from_product([year, semester, academic, gender],
names=['學年', '學期', '學制', '性別'])
df = pd.DataFrame(np.random.randint(300,size=(24,1)),index=index,columns=["學生人數"])
df
輸出結果太長,只截圖一部份:
多重索引的樣子:
df.index
多重索引的名字是FrozenList
df.index.names
FrozenList(['學年', '學期', '學制', '性別'])
# 多重索引第0層,也就是"學年"
df.index.get_level_values(0)
Int64Index([108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109,
109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109],
dtype='int64', name='學年')
# 多重索引直接帶入"學年",得到第0層的索引
df.index.get_level_values('學年')
Int64Index([108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109,
109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109],
dtype='int64', name='學年')
# 多重索引第1層,也就是"學期"
df.index.get_level_values(1)
Int64Index([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2],
dtype='int64', name='學期')
# 多重索引直接帶入"學期",得到第1層的索引
df.index.get_level_values('學期')
Int64Index([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2],
dtype='int64', name='學期')
以下類推第2層是"學制",第3層是"性別"
df.loc[(108)]
#df.loc[108] #中括號裏面沒有小括號也可以
df.loc[(109, 2)]
第2、3層資料,就以上小括號裏面再把"學制"和"性別"的值帶進去就可以得到。
dfcopy = df.copy()
dfcopy.index = dfcopy.index.set_levels([2019, 2020] , level=0)
dfcopy
輸出結果太長,只截圖一部份:
dfcopy = df.copy()
dfcopy.index = dfcopy.index.set_levels([[2019, 2020], ['one', 'two']] , level=[0,1])
dfcopy
輸出結果太長,只截圖一部份: